
namespace FastFood.DataAccess
{
	using System;
	using System.Collections.Generic;
	using System.Data;
	using System.Data.Common;
	using Microsoft.Practices.EnterpriseLibrary.Data;
	using EDOSwit.Entity;
	using FastFood.Business.Entities;

	/// <summary>
	/// Represents the DataAccess of LogServicioData.
	/// </summary>
	public class LogServicioData : Singleton<LogServicioData>
	{
		#region Attributes

		private readonly Database BaseDatos = DatabaseFactory.CreateDatabase();

		#endregion

		#region Methods

        /// <summary>
        /// Selects all records from the LogServicio table by a foreign key.
        /// </summary>
        public IList<LogServicio> ListarBySearch(string descripcion, DateTime? fecha, int? idTipo, int? idEstado)
        {
            var entidades = new List<LogServicio>();
            var comando = BaseDatos.GetStoredProcCommand("SelectLogServicioBySearch");
            BaseDatos.AddInParameter(comando, "Descripcion", DbType.String, descripcion);
            BaseDatos.AddInParameter(comando, "IdTipo", DbType.Int32, idTipo);
            BaseDatos.AddInParameter(comando, "Fecha", DbType.DateTime, fecha);
            BaseDatos.AddInParameter(comando, "IdEstado", DbType.Int32, idEstado);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new LogServicio
                    {
                        IdLog = lector.IsDBNull(lector.GetOrdinal("IdLog")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLog")),
                        IdTipo = lector.IsDBNull(lector.GetOrdinal("IdTipo")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdTipo")),
                        FechaAlerta = lector.IsDBNull(lector.GetOrdinal("FechaAlerta")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaAlerta")),
                        IdLote = lector.IsDBNull(lector.GetOrdinal("IdLote")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLote")),
                        IdInsumo = lector.IsDBNull(lector.GetOrdinal("IdInsumo")) ? default(short) : lector.GetInt16(lector.GetOrdinal("IdInsumo")),
                        Descripcion = lector.IsDBNull(lector.GetOrdinal("Descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("Descripcion")),
                        FechaCreacion = lector.IsDBNull(lector.GetOrdinal("FechaCreacion")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaCreacion")),
                        IdEstado = lector.IsDBNull(lector.GetOrdinal("IdEstado")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdEstado"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Cuenta record from the LogServicio table by estado.
        /// </summary>
        public int ContarLogServicioByEstado(int idEstado)
        {
            var comando = BaseDatos.GetStoredProcCommand("ContarLogServicio");
            BaseDatos.AddInParameter(comando, "IdEstado", DbType.Int32, idEstado);

            var resultado = Convert.ToInt32(BaseDatos.ExecuteScalar(comando));
            comando.Dispose();
            return resultado;
        }

        /// <summary>
        /// Selects all records from the LogServicio table by a foreign key.
        /// </summary>
        public IList<LogServicio> Listar()
        {
            var entidades = new List<LogServicio>();
            var comando = BaseDatos.GetStoredProcCommand("SelectAllLogServicio");

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new LogServicio
                    {
                        IdLog = lector.IsDBNull(lector.GetOrdinal("IdLog")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLog")),
                        IdTipo = lector.IsDBNull(lector.GetOrdinal("IdTipo")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdTipo")),
                        FechaAlerta = lector.IsDBNull(lector.GetOrdinal("FechaAlerta")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaAlerta")),
                        IdLote = lector.IsDBNull(lector.GetOrdinal("IdLote")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLote")),
                        IdInsumo = lector.IsDBNull(lector.GetOrdinal("IdInsumo")) ? default(short) : lector.GetInt16(lector.GetOrdinal("IdInsumo")),
                        Descripcion = lector.IsDBNull(lector.GetOrdinal("Descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("Descripcion")),
                        FechaCreacion = lector.IsDBNull(lector.GetOrdinal("FechaCreacion")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaCreacion")),
                        IdEstado = lector.IsDBNull(lector.GetOrdinal("IdEstado")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdEstado"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the LogServicio table by a foreign key.
        /// </summary>
        public LogServicio Obtener(int idLog)
        {
            var logServicio = default(LogServicio);
            var comando = BaseDatos.GetStoredProcCommand("SelectLogServicio");

            BaseDatos.AddInParameter(comando, "IdLog", DbType.Int32, idLog);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    logServicio = new LogServicio
                    {
                        IdLog = lector.IsDBNull(lector.GetOrdinal("IdLog")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLog")),
                        IdTipo = lector.IsDBNull(lector.GetOrdinal("IdTipo")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdTipo")),
                        FechaAlerta = lector.IsDBNull(lector.GetOrdinal("FechaAlerta")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaAlerta")),
                        IdLote = lector.IsDBNull(lector.GetOrdinal("IdLote")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLote")),
                        IdInsumo = lector.IsDBNull(lector.GetOrdinal("IdInsumo")) ? default(short) : lector.GetInt16(lector.GetOrdinal("IdInsumo")),
                        Descripcion = lector.IsDBNull(lector.GetOrdinal("Descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("Descripcion")),
                        FechaCreacion = lector.IsDBNull(lector.GetOrdinal("FechaCreacion")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaCreacion")),
                        IdEstado = lector.IsDBNull(lector.GetOrdinal("IdEstado")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdEstado"))
                    };
                }
            }
            comando.Dispose();
            return logServicio;
        }

        /// <summary>
        /// Saves a record to the LogServicio table.
        /// </summary>
        public int Agregar(LogServicio logServicio)
        {
            var comando = BaseDatos.GetStoredProcCommand("InsertLogServicio");
            BaseDatos.AddOutParameter(comando, "IdLog", DbType.Int32, 4);
            BaseDatos.AddInParameter(comando, "IdTipo", DbType.Int32, logServicio.IdTipo);
            BaseDatos.AddInParameter(comando, "FechaAlerta", DbType.DateTime, logServicio.FechaAlerta);
            BaseDatos.AddInParameter(comando, "IdLote", DbType.Int32, logServicio.IdLote);
            BaseDatos.AddInParameter(comando, "IdInsumo", DbType.Int16, logServicio.IdInsumo);
            BaseDatos.AddInParameter(comando, "Descripcion", DbType.String, logServicio.Descripcion);
            BaseDatos.AddInParameter(comando, "FechaCreacion", DbType.DateTime, logServicio.FechaCreacion);
            BaseDatos.AddInParameter(comando, "IdEstado", DbType.Int32, logServicio.IdEstado);

            var resultado = BaseDatos.ExecuteNonQuery(comando);
            if (resultado == 0) throw new Exception("Error al Agregar LogServicio.");

            var valorDevuelto = (int)BaseDatos.GetParameterValue(comando, "IdLog"); ;
            comando.Dispose();
            return valorDevuelto;
        }

        public int Agregar(LogServicio logServicio, DbTransaction transaccion)
        {
            var comando = BaseDatos.GetStoredProcCommand("InsertLogServicio");
            BaseDatos.AddOutParameter(comando, "IdLog", DbType.Int32, 4);
            BaseDatos.AddInParameter(comando, "IdTipo", DbType.Int32, logServicio.IdTipo);
            BaseDatos.AddInParameter(comando, "FechaAlerta", DbType.DateTime, logServicio.FechaAlerta);
            BaseDatos.AddInParameter(comando, "IdLote", DbType.Int32, logServicio.IdLote);
            BaseDatos.AddInParameter(comando, "IdInsumo", DbType.Int16, logServicio.IdInsumo);
            BaseDatos.AddInParameter(comando, "Descripcion", DbType.String, logServicio.Descripcion);
            BaseDatos.AddInParameter(comando, "FechaCreacion", DbType.DateTime, logServicio.FechaCreacion);
            BaseDatos.AddInParameter(comando, "IdEstado", DbType.Int32, logServicio.IdEstado);

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
            if (resultado == 0) throw new Exception("Error al Agregar LogServicio.");

            var valorDevuelto = (int)BaseDatos.GetParameterValue(comando, "IdLog"); ;
            comando.Dispose();
            return valorDevuelto;
        }

        /// <summary>
        /// Updates a record in the LogServicio table.
        /// </summary>
        public bool Modificar(LogServicio logServicio)
        {
            var comando = BaseDatos.GetStoredProcCommand("UpdateLogServicio");
            BaseDatos.AddInParameter(comando, "IdLog", DbType.Int32, logServicio.IdLog);
            BaseDatos.AddInParameter(comando, "IdTipo", DbType.Int32, logServicio.IdTipo);
            BaseDatos.AddInParameter(comando, "FechaAlerta", DbType.DateTime, logServicio.FechaAlerta);
            BaseDatos.AddInParameter(comando, "IdLote", DbType.Int32, logServicio.IdLote);
            BaseDatos.AddInParameter(comando, "IdInsumo", DbType.Int16, logServicio.IdInsumo);
            BaseDatos.AddInParameter(comando, "Descripcion", DbType.String, logServicio.Descripcion);
            BaseDatos.AddInParameter(comando, "FechaCreacion", DbType.DateTime, logServicio.FechaCreacion);
            BaseDatos.AddInParameter(comando, "IdEstado", DbType.Int32, logServicio.IdEstado);

            var resultado = BaseDatos.ExecuteNonQuery(comando);
            if (resultado == 0) throw new Exception("Error al Modificar LogServicio.");

            comando.Dispose();
            return true;
        }

        public bool ModificarPorIdInsumo(short idInsumo, int estado)
        {
            var comando = BaseDatos.GetStoredProcCommand("UpdateLogServicioByIdInsumo");
            BaseDatos.AddInParameter(comando, "IdInsumo", DbType.Int16, idInsumo);
            BaseDatos.AddInParameter(comando, "IdEstado", DbType.Int32, estado);

            var resultado = BaseDatos.ExecuteNonQuery(comando);
            if (resultado == 0) throw new Exception("Error al Modificar LogServicio.");

            comando.Dispose();
            return true;
        }

        /// <summary>
        /// Deletes a record from the LogServicio table by its primary key.
        /// </summary>
        public bool Eliminar(int idLog)
        {
            var comando = BaseDatos.GetStoredProcCommand("DeleteLogServicio");
            BaseDatos.AddInParameter(comando, "IdLog", DbType.Int32, idLog);

            var resultado = BaseDatos.ExecuteNonQuery(comando);
            if (resultado == 0) throw new Exception("Error al Eliminar LogServicio.");
            comando.Dispose();
            return true;
        }

        /// <summary>
        /// Deletes a record from the LogServicio table by a foreign key.
        /// </summary>
        public void EliminarPorIdInsumo(short idInsumo)
        {
            var comando = BaseDatos.GetStoredProcCommand("DeleteLogServicioByIdInsumo");
            BaseDatos.AddInParameter(comando, "IdInsumo", DbType.Int16, idInsumo);

            var resultado = BaseDatos.ExecuteNonQuery(comando);
            if (resultado == 0) throw new Exception("Error al Eliminar LogServicio.");
            comando.Dispose();
        }

        /// <summary>
        /// Deletes a record from the LogServicio table by a foreign key.
        /// </summary>
        public void EliminarPorIdLote(int idLote, int? estado)
        {
            var comando = BaseDatos.GetStoredProcCommand("DeleteLogServicioByIdLote");
            BaseDatos.AddInParameter(comando, "IdLote", DbType.Int32, idLote);
            BaseDatos.AddInParameter(comando, "IdEstado", DbType.Int32, estado);

            var resultado = BaseDatos.ExecuteNonQuery(comando);
            if (resultado == 0) throw new Exception("Error al Eliminar LogServicio.");
            comando.Dispose();
        }

        public void EliminarPorIdLote(int idLote, int? estado, DbTransaction transaccion)
        {
            var comando = BaseDatos.GetStoredProcCommand("DeleteLogServicioByIdLote");
            BaseDatos.AddInParameter(comando, "IdLote", DbType.Int32, idLote);
            BaseDatos.AddInParameter(comando, "IdEstado", DbType.Int32, estado);

            var resultado = BaseDatos.ExecuteNonQuery(comando, transaccion);
            if (resultado == 0) throw new Exception("Error al Eliminar LogServicio.");
            comando.Dispose();
        }

        /// <summary>
        /// Selects all records from the LogServicio table by a foreign key.
        /// </summary>
        public IList<LogServicio> ListarPorIdInsumo(short idInsumo, DateTime? fecha)
        {
            var entidades = new List<LogServicio>();
            var comando = BaseDatos.GetStoredProcCommand("SelectLogServicioByIdInsumo");

            BaseDatos.AddInParameter(comando, "IdInsumo", DbType.Int16, idInsumo);
            BaseDatos.AddInParameter(comando, "FechaAlerta", DbType.DateTime, fecha);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new LogServicio
                    {
                        IdLog = lector.IsDBNull(lector.GetOrdinal("IdLog")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLog")),
                        IdTipo = lector.IsDBNull(lector.GetOrdinal("IdTipo")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdTipo")),
                        FechaAlerta = lector.IsDBNull(lector.GetOrdinal("FechaAlerta")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaAlerta")),
                        IdLote = lector.IsDBNull(lector.GetOrdinal("IdLote")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLote")),
                        IdInsumo = lector.IsDBNull(lector.GetOrdinal("IdInsumo")) ? default(short) : lector.GetInt16(lector.GetOrdinal("IdInsumo")),
                        Descripcion = lector.IsDBNull(lector.GetOrdinal("Descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("Descripcion")),
                        FechaCreacion = lector.IsDBNull(lector.GetOrdinal("FechaCreacion")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaCreacion")),
                        IdEstado = lector.IsDBNull(lector.GetOrdinal("IdEstado")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdEstado"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

        /// <summary>
        /// Selects all records from the LogServicio table by a foreign key.
        /// </summary>
        public IList<LogServicio> ListarPorIdLote(int idLote)
        {
            var entidades = new List<LogServicio>();
            var comando = BaseDatos.GetStoredProcCommand("SelectLogServicioByIdLote");

            BaseDatos.AddInParameter(comando, "IdLote", DbType.Int32, idLote);

            using (var lector = BaseDatos.ExecuteReader(comando))
            {
                while (lector.Read())
                {
                    entidades.Add(new LogServicio
                    {
                        IdLog = lector.IsDBNull(lector.GetOrdinal("IdLog")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLog")),
                        IdTipo = lector.IsDBNull(lector.GetOrdinal("IdTipo")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdTipo")),
                        FechaAlerta = lector.IsDBNull(lector.GetOrdinal("FechaAlerta")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaAlerta")),
                        IdLote = lector.IsDBNull(lector.GetOrdinal("IdLote")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdLote")),
                        IdInsumo = lector.IsDBNull(lector.GetOrdinal("IdInsumo")) ? default(short) : lector.GetInt16(lector.GetOrdinal("IdInsumo")),
                        Descripcion = lector.IsDBNull(lector.GetOrdinal("Descripcion")) ? default(string) : lector.GetString(lector.GetOrdinal("Descripcion")),
                        FechaCreacion = lector.IsDBNull(lector.GetOrdinal("FechaCreacion")) ? default(DateTime) : lector.GetDateTime(lector.GetOrdinal("FechaCreacion")),
                        IdEstado = lector.IsDBNull(lector.GetOrdinal("IdEstado")) ? default(int) : lector.GetInt32(lector.GetOrdinal("IdEstado"))
                    });
                }
            }
            comando.Dispose();
            return entidades;
        }

		#endregion
	}
}
